Prop
在 vue.js 中, 使用prop 可以实现父组件向子组件传递值,在子组件中的 props 中的数据将会和父组件中传递的相应的 prop 保持一致,在传递 prop 的时候,可以传递一个数组, 例如:1 | props: ['data1', 'data2', 'data3' ...] |
type 以及 default 属性:1 | props: { |
初始化 props
在 initState 中:当当前组件中存在 props 的时候, 对于 props 执行 initProps 进行初始化:1 | function initState (vm) { |
initProps 中接受两个参数: vm 当前 vue 的实例, propsOptions 在当前组件中规范化后的 props 对象在执行initProps方法之前, 在vm.$options属性中的props属性中已经对于传递的props进行了规范化处理为下面的这种形式:
1
2
3
4
5 >test: {
> type: sometype,
> default: // 默认值, 如果没有传, 那么就没有
>}
>
initProps:1 | // 用于初始化 props 对象 |
1 | var propsData = vm.$options.propsData || {}; // 获取到父组件传递到子组件中的值 |
toggleObserving 方法用来切换是否对与数据进行监听的开关函数:1 |
|
shouldObserve 的值, 这个值的作用我们后面在说, 现在, 我们先看下在 initProps 中的 for in 中的 loop 方法:1 | for (var key in propsOptions) loop(key); |
loop 方法:loop 方法:1 | // key prop 值 |
validateProp 方法, 这个方法定义如下:1 | /** |
prop: 当前传入 prop 值的对象absent: 布尔值, 当前 prop 有没有被父组件传入value: 父组件传入的 prop 的值, 如果没有传入,为 undefinedbooleanIndex: 是通过 getTypeIndex 方法返回的, 这个方法的作用是:当 prop 中声明的 type 中包含有布尔值的时候, 如果 type 为 String, 返回 0, 如果 type 为数组, 返回这个 Boolean 值在 type 数组中的顺序 index, 如果不包含布尔值, 那么返回 -1getTypeIndex:1 | // expectedTypes: prop 中声明的 type |
isSameType 方法来进行比较者两个 type 是否相等:1 | /** |
getType 中, 调用 fn.toString() 方法, 再通过正则表达式获取到 (\w+) 内的内容,例如:因为, 在 js 中例如Boolean,String之类的类型, 都是代表着一个个的函数方法, 对于这个函数, 可以调用 toString
1 | Boolean |
Boolean 字段的时候1 | // 当 prop 的type中包含有 “Boolean” 的时候 |
1 | export default { |
1 | <child prop-data=""></child> |
propData 值为 true;或者, 当在父组件中如下定义的时候:1 | <child prop-data="propData"></child> |
true,总之:当定义的 prop 接受值的类型,Boolean 值类型优先级要高于 String 的时候(在 type 中 Boolean 在 String 前面 [Boolean, String]):- 当传递的值为空字符串的时候, 接受到的prop 值变为
true - 当传递的值为字符串并且和驼峰后的 prop 名相同的时候, 接受的值也将转为
true
default 属性, 当校验 type 中包含有Boolean 的时候, 这个时候, 获取这个 prop 的值将为 falsechild.vue 组件中:1 | export default { |
1 | <child></child> |
child.vue 组件中获取到 propData 的值为 false;